const { renameSync, writeFileSync, appendFileSync } = require('fs')
const pathURL = require('../utils/path')
const isFileExisted = require('../utils/exist')
const { validateFileName } = require('../utils/validate')

// 收集结果信息
const sends = []
/**
 * @author lihaorun
 * @param {array} commandArr 命令数组
 * @returns {object} 名称，修改内容，追加内容
 * @desc 参数解析
 */
const parseArgs = commandArr => {
  const findName = commandArr[commandArr.findIndex(command => command === '-n') + 1] ?? ''
  const findContent = commandArr[commandArr.findIndex(command => command === '-c') + 1] ?? ''
  const findAppend = (commandArr[commandArr.findIndex(command => command === '-a') + 1]) ?? ''
  const name = findName !== 'modifyFile' ? suffix(commandArr[1], findName) : ''
  const content = findContent !== 'modifyFile' ? findContent : ''
  const append = findAppend !== 'modifyFile' ? findAppend : ''
  return { name, content, append }
}
/**
 * @author lihaorun
 * @param {string} target 目标文件
 * @param {string} fileName  修改的文件名称
 * @returns {string} 文件名称
 * @desc 后缀名处理
 */
const suffix = (target, fileName) =>
  /\.\w+$/.test(fileName) ? fileName : fileName + '.' + target.split('.').pop()
/**
 * @author lihaorun
 * @param {array} commandArr 命令数组 
 * @returns {boolean} 是否通过验证
 * @desc 命令参数验证
 */
const validate = commandArr => {
  const directions = ['-a', '-c', '-n']
  const commandDirections = commandArr.filter(command => command.startsWith('-'))
  return commandArr.length > 2 && commandDirections.some(direction => directions.includes(direction))
}
/**
 * @author lihaorun
 * @param {string} target 目标文件
 * @param {string} newName  修改文件的新文件名
 * @returns {string} 修改后的文件名
 * @desc 修改文件名称
 */
const modifyFileName = (target, newName) => {
  try {
    renameSync(pathURL(target), pathURL(newName))
    sends.push(`修改${target}文件名称成功`)
    return newName
  } catch (error) {
    sends.push('修改名称失败')
  }
}
/**
 * @author lihaorun
 * @param {string} target 目标文件
 * @param {string} content 文件内容
 * @returns 
 * @desc 修改文件内容
 */
const modifyFileContent = (target, content) => {
  try {
    writeFileSync(pathURL(target), content)
    sends.push(`修改${target}文件的内容成功`)
  } catch (error) {
    sends.push('修改文件内容失败')
  }
}
/**
 * @author lihaorun
 * @param {string} target  目标文件
 * @param {string} appendContent 追加的文件内容
 * @returns 
 * @desc 向文件中追加内容
 */
const modifyFileAppend = (target, appendContent) => {
  try {
    appendFileSync(pathURL(target), appendContent)
    sends.push(`向${target}文件追加内容成功`)
  } catch (error) {
    sends.push('追加内容失败')
  }
}
/**
 * @author lihaorun
 * @param {string} command 命令
 * @returns 
 * @desc 修改文件
 */
const modifyFile = (command) => {
  // 初始化队列
  sends.length = 0
  const comArr = command.split(' ')
  if (!validate(comArr)) {
    process.send(['修改文件格式有误,请查看帮助 -h'])
    return
  }
  // 解构
  const [, target] = comArr;
  let { name, content, append } = parseArgs(comArr)
  // 判断目标文件是否存在
  if (!isFileExisted(target)) {
    process.send(['修改的目标文件不存在'])
    return
  }
  // 文件名称是否合法
  if (validateFileName(name)) {
    process.send(['修改错误， 文件名不能包含以下任何字符： / \ : * ? " < > |'])
    return
  }
  // 判断指定后的文件资源是否被占用
  if (isFileExisted(name)) {
    process.send(['修改错误， 目标文件出现重名'])
    return
  }
  // 修改文件名称操作
  name = name ? modifyFileName(target, name) : target;
  // 修改文件内容操作
  comArr.findIndex(command => command === '-c') !== -1 && modifyFileContent(name, content)
  // 追加文件内容操作
  comArr.findIndex(command => command === '-a') !== -1 && modifyFileAppend(name, append)
  // 进程通信
  process.send(sends)
}
// 进程通信
process.on('message', modifyFile);